import java.util.*;

public class Test {
    //
}
class Solution
{
    public boolean canFinish(int n, int[][] p)
    {
        // 1. 准备⼯作
        int[] in = new int[n]; // 统计每⼀个顶点的⼊度
        Map<Integer, List<Integer>> edges = new HashMap<>(); // 邻接表存图
        // 2. 建图
        for(int i = 0; i < p.length; i++)
        {
            int a = p[i][0], b = p[i][1]; // b -> a
            if(!edges.containsKey(b))
            {
                edges.put(b, new ArrayList<>());
            }
            edges.get(b).add(a);
            in[a]++;
        }
        // 3. 拓扑排序
        Queue<Integer> q = new LinkedList<>();
        // (1) 先把⼊度为 0 的点，加⼊到队列中
        for(int i = 0; i < n; i++)
        {
            if(in[i] == 0) q.add(i);
        }
        // (2) bfs
        while(!q.isEmpty())
        {
            int t = q.poll();
            for(int a : edges.getOrDefault(t, new ArrayList<>()))
        {
            in[a]--;
            if(in[a] == 0) q.add(a);
        }
        }
        // 4. 判断是否有环
        for(int x : in)
            if(x != 0) return false;

        return true;
    }
}

